
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>SpringBoot整合Caffeine本地缓存 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>SpringBoot整合Caffeine本地缓存 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Caffeine作为一个高性能的Java缓存库，其主要特点是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Caffeine的主要特点包括：1. 高性能，具有极快的读写性能，适合高并发场景；2. 丰富的缓存策略，支持基于时间、大小等多种缓存失效策略；3. 自动回收，当内存占用达到限制后会自动回收不常用的缓存。</div>
          </div>
          <div class="card-source">来源: 1. 什么是Caffeine缓存？</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Spring Boot中集成Caffeine缓存需要哪三个主要步骤？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">集成步骤包括：1. 在项目的pom.xml中添加Caffeine和Spring Cache相关依赖；2. 在application.properties或application.yml文件中配置Caffeine缓存的类型和策略；3. 在Spring Boot应用的主类或配置类上添加 @EnableCaching 注解以启用缓存支持。</div>
          </div>
          <div class="card-source">来源: 3. 集成步骤</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Spring Cache提供了哪些常用的注解来简化缓存操作？请分别说明其功能。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring Cache提供的常用注解包括：@Cacheable用于缓存方法返回值；@CacheEvict用于清除缓存；@CachePut用于更新缓存。</div>
          </div>
          <div class="card-source">来源: 4. 缓存注解的使用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">@Cacheable 和 @CachePut 注解在使用上有什么核心区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">核心区别在于：@Cacheable 在执行方法前会先检查缓存，如果缓存中存在数据则直接返回缓存值，不执行方法。而 @CachePut 不会检查缓存，它会确保方法被执行，然后将方法的返回值更新到缓存中。</div>
          </div>
          <div class="card-source">来源: 4.1 @Cacheable注解 & 4.3 @CachePut注解</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">配置</div>
          <div class="card-question">如何在 application.properties 中配置Caffeine缓存，使其最大容量为100个元素，并且在元素最后一次被访问后的600秒后过期？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">配置</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以通过以下配置实现：spring.cache.type=caffeine 以及 spring.cache.caffeine.spec=maximumSize=100,expireAfterAccess=600s。</div>
          </div>
          <div class="card-source">来源: 3.2 配置Caffeine缓存</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Caffeine支持哪两种常见的缓存过期策略？它们分别是什么含义？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Caffeine支持两种常见的过期策略：1. expireAfterWrite：指元素写入缓存后经过一定时间自动过期。2. expireAfterAccess：指元素在一定时间内没有被访问则会自动过期。</div>
          </div>
          <div class="card-source">来源: 6.1 缓存过期策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">将Spring Boot与Caffeine集成可以带来哪些具体优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">集成的优势主要有三点：1. 性能提升：通过缓存常用数据来大幅提高应用性能，减少数据库负载。2. 内存管理：Caffeine通过LRU策略、最大缓存大小限制等机制自动管理内存，避免内存泄漏。3. 易于集成：Spring Cache的抽象层使得与Caffeine的集成非常简单。</div>
          </div>
          <div class="card-source">来源: 2.1 Caffeine缓存集成的优势</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当数据发生变更时，应该使用哪个Spring Cache注解来删除旧的缓存数据？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当数据发生变更时，应使用 @CacheEvict 注解来清除缓存。这个注解常用于更新或删除数据的操作方法上，以确保缓存与数据库的一致性。</div>
          </div>
          <div class="card-source">来源: 7. 手动清除缓存</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Spring Boot项目中，需要添加哪个注解来全局启用缓存功能？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">需要在Spring Boot应用的主类或任意配置类中添加 @EnableCaching 注解来启用缓存支持。</div>
          </div>
          <div class="card-source">来源: 3.3 启用缓存支持</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
